﻿#region FJRF - Autor
/*
 * Formulario creado el día 30/01/2015
 * Programador principal: Francisco Javier Ramos Fernandez
 * Diseñado por: Mauricio V.
 * Ultima Fecha de modificación: []
 * Modificado por el programador: []
 */
#endregion

using System;
using System.Windows.Controls.Primitives;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.clases;
using System.ComponentModel;
using System.IO;
using System.Diagnostics;
using produccion.vistamodelo;
using produccion.reportes;
using System.Threading;
using System.Globalization;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmAuditoriaDeInventarios.xaml
    /// </summary>
    public partial class FrmAuditoriaDeInventarios : Window
    {
        #region FJRF - VARIABLES GENERICAS PARA TODO EL FORMULARIO
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral
        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        DataSet DsConsulta;//FJRF - Usamos este DataSet para hacer consultas generales
        String StrCodigoPrimerColorReferencia;//FJRF - Para el codigo de la referencia de la foto

        int IntInicial, IntFinal;//FJRF - Estos son las variables de los parametros que se usaran para enviarle los datos al SP
        DateTime DttFechaActual, DttDesde, DttHasta;//FJRF - La usamos para saber la fecha actual

        string StrMensajeBox = "";//FJRF - Para los mensajes de las cajas de texto
        string StrCaptionBox = "";//FJRF - Para los mensajes de los caption de las cajas de texto
        #endregion

        public FrmAuditoriaDeInventarios()
        {
            InitializeComponent();
        }

        #region FJRF - OBJETOS DEL FORMULARIO
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            string strTituloVentana = "AUDITORIA DE INVENTARIOS" + " - Usuario:" + MDOgeneral.usuario + "- [FrmAuditoriaDeInventarios]";//FJRF - Armamos el titulo de la ventana
            Title = strTituloVentana;//FJRF - Ponemos el titulo de la ventana

            TxtDatoABuscar.Style = null;//FJRF - Le quitamos el estilo al objeto para q no pase el enter de forma automatica

            #region FJRF - InicializamosVariablesYObjetosDelSistema
            DttFechaActual = DateTime.Now;//FJRF - Cargamos la variable tipo fecha con la fecha actual del sistema
            
            CboInicial.SelectedIndex = 0;//FJRF - Ponemos el combo en la primera posicion
            CboFinal.SelectedIndex = 0;//FJRF - Ponemos el combo en la primera posicion

            DtpDesde.SelectedDate = DttFechaActual;//FJRF - Ponemos la fecha actual
            DtpHasta.SelectedDate = DttFechaActual;//FJRF - Ponemos la fecha actual
            #endregion
        }
        protected void PttV_Salir()
        {
            this.Close();//FJRF - Cierra el modulo actual
        }
        private void CboInicial_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            IntInicial = int.Parse(((ComboBoxItem)CboInicial.SelectedItem).Tag.ToString());//FJRF - Se extrae la informacion que hay en el tag del combo que se usara como parametro en el Sp
            TxtDatoABuscar.Focus();
        }
        private void CboFinal_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            IntFinal = int.Parse(((ComboBoxItem)CboFinal.SelectedItem).Tag.ToString());//FJRF - Se extrae la informacion que hay en el tag del combo que se usara como parametro en el Sp
            TxtDatoABuscar.Focus();
        }
        private void BtnProcesar_Click(object sender, RoutedEventArgs e)
        {
            PttV_Procesar();//FJRF - Procesamos los datos
        }
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        private void TxtDatoABuscar_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si digitan la tecla enter hacemos lo siguiente
            {
                if (TxtDatoABuscar.Text.Trim() == "")//FJRF - Si el dato que se va a buscar esta vacio hacemo lo siguiente
                {
                    StrConsulta = "SELECT * FROM VIS_AUDINV ";//FJRF - Consultamos todos los datos
                }
                else//FJRF - Si por el contrario el campo a buscar trae datos hacemos lo siguiente
                {
                    StrConsulta = "SELECT * FROM VIS_AUDINV WHERE " + CboCampoABuscar.Text + " LIKE '%" + TxtDatoABuscar.Text + "%' ORDER BY  " + CboCampoABuscar.Text + " ";//FJRF - Buscamos los datos pero siltrandolo por el campo que se quiere y se ordenan los datos por ese mismo dato
                }
                
                DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos
                DtgDatosConsultados.ItemsSource = DtConsulta.DefaultView;//FJRF - Cargamos los datos al grid

                TxtDatoABuscar.SelectAll();//FJRF - Selecciona todo lo del texto para q no exista forma de borrar nuevamente
            }
        }
        private void DtgDatosConsultados_KeyUp(object sender, KeyEventArgs e)
        {
            #region FJRF - BuscarLaFoto
            //FJRF - [Esta seccion se habilita solo si se necesita para buscar la imagen del zapato ya no es sino habilitarla]

            //String StrReferencia = "", StrColor = "", StrNombre = "";//FJRF - Variables que se necesitan para enviarlos como parametros para buscar la imagen de la referencia

            //DataRowView DrwDatosDelGrid = DtgDatosConsultados.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
            //DataRow DrFilaDelGrid = DrwDatosDelGrid.Row;//FJRF - Asignamos las finas

            //StrNombre = Convert.ToString(DrFilaDelGrid.ItemArray[1]);//FJRF - Traemos el dato en la columna dada de la fila seleccionada
            //StrReferencia = Convert.ToString(DrFilaDelGrid.ItemArray[0]);//FJRF - Traemos el dato en la columna dada de la fila seleccionada
            //StrColor = Convert.ToString(DrFilaDelGrid.ItemArray[2]);//FJRF - Traemos el dato en la columna dada de la fila seleccionada

            //PonerImagen(StrReferencia, StrColor, StrNombre);//FJRF - Buscamos la imagen
            #endregion
        }
        private void DtgDatosConsultados_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna != "CODMAT" && strNombreColumna != "MATERIAL" && strNombreColumna != "CODCOL" && strNombreColumna != "COLOR" && strNombreColumna != "CODGRP" && strNombreColumna != "GRUPO" && strNombreColumna != "CODSUB" && strNombreColumna != "SUBGRUPO" && strNombreColumna != "UNICOM")//FJRF - Si la columna que le vamos a dar el formato no tiene alguno de estos nombre le damos formato
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = newCellStyleAlinearDerecha();//FJRF - Alineamos la celda a la derecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella

        }
        private void CboInmovilizarColumnas_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            int IntColumnasAImnovilizar;//FJRF - Variables que va a contener el numero de columnas a inmovilizar
            IntColumnasAImnovilizar = int.Parse(CboInmovilizarColumnas.SelectedItem.ToString().Replace("System.Windows.Controls.ComboBoxItem:", "").Trim());//FJRF - Extraemos las columnas que el usuario quiere inmovilizar
            DtgDatosConsultados.FrozenColumnCount = IntColumnasAImnovilizar;//FJRF - Inmovilizamos las columnas
        }
        #endregion

        #region FJRF - PROCEDIMIENTOS Y FUNCIONES PROPIAS DEL FORMULARIO
        protected void PttV_Procesar()
        {
            DttDesde = DtpDesde.SelectedDate.Value;//FJRF - Tomamos la fecha seleccionada y la asignamos en las variables que enviaremos los parametros al Sp
            DttHasta = DtpHasta.SelectedDate.Value;//FJRF - Tomamos la fecha seleccionada y la asignamos en las variables que enviaremos los parametros al Sp
            EjecutarSp_SP_INFAUDINV(IntInicial, DttDesde, DttHasta, IntFinal);//FJRF - Ejecutamos el Sp y retornamos los datos con los parametros enviados por el usuario
        }
        private void EjecutarSp_SP_INFAUDINV(int Int_pnu_mesini, DateTime Dtt_pdt_desde, DateTime Dtt_pdt_hasta, int Int_pnu_mesfin)//FJRF - Este procedimiento ejecuta un sp
        {
            #region FJRF - Cultura
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();//FJRF - Instanciamos la forma de cambiar el formato de las fechas
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";//FJRF - Garantizamos que el formato corto sea este 
            #endregion
            try
            {
                MDOgeneral.spComando.CommandText = "SP_INFAUDINVP";//FJRF - Sp que ejecutaremos
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;//FJRF - Instanciamos el sp
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();//FJRF - Limpiamos parametros anteriores

                //Input
                MDOgeneral.spComando.Parameters.Add("pnu_mesini", Oracle.DataAccess.Client.OracleDbType.Int32).Value = Int_pnu_mesini;//FJRF - Enviamos el parametro en el tipo que se requiere

                MDOgeneral.spComando.Parameters.Add("pdt_desde", Oracle.DataAccess.Client.OracleDbType.Date).Value = Dtt_pdt_desde;//FJRF - Enviamos el parametro en el tipo que se requiere
                MDOgeneral.spComando.Parameters.Add("pdt_hasta", Oracle.DataAccess.Client.OracleDbType.Date).Value = Dtt_pdt_hasta;//FJRF - Enviamos el parametro en el tipo que se requiere

                MDOgeneral.spComando.Parameters.Add("pnu_mesfin", Oracle.DataAccess.Client.OracleDbType.Int32).Value = Int_pnu_mesfin;//FJRF - Enviamos el parametro en el tipo que se requiere

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;//FJRF - Enviamos el parametro en el tipo que se requiere
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;//FJRF - Enviamos el parametro en el tipo que se requiere
                MDOgeneral.spComando.ExecuteNonQuery();//FJRF- Ejecutamos el Sp

                StrConsulta = "SELECT * FROM VIS_AUDINV";//FJRF - Consulamos la tabla que retorna
                DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos
                DtgDatosConsultados.ItemsSource = DtConsulta.DefaultView;//FJRF - Cargamos los datos al grid

                StrConsulta = "select column_name AS NombreCampo from all_tab_columns where table_name = 'VIS_AUDINV'";//FJRF - Extraemos todos los datos que pueda tener la tabla que se retorna
                CargarCombo(CboCampoABuscar, StrConsulta, "NombreCampo", "NombreCampo");//FJRF - Cargamos los datos consultados

                if (DtConsulta.Rows.Count > 0)//FJRF - Si la consulta tiene datos hacemos lo siguiente
                {
                    LblTituloBuscar.Visibility = Visibility.Visible;//FJRF - Ponemos el objeto visible
                    CboCampoABuscar.Visibility = Visibility.Visible;//FJRF - Ponemos el objeto visible
                    TxtDatoABuscar.Visibility = Visibility.Visible;//FJRF - Ponemos el objeto visible
                    LblTituloInmovilizarColumnas.Visibility = Visibility.Visible;//FJRF - Ponemos el objeto visible
                    CboInmovilizarColumnas.Visibility = Visibility.Visible;//FJRF - Ponemos el objeto visible

                    CboInmovilizarColumnas.SelectedIndex = 0;//FJRF - Decimos que por defecto no se inmovilizara ninguna columna
                }
                else//FJRF - Si la consulta no trae datos hacemos lo siguiente
                {
                    LblTituloBuscar.Visibility = Visibility.Hidden;//FJRF - Ponemos invisible el objeto
                    CboCampoABuscar.Visibility = Visibility.Hidden;//FJRF - Ponemos invisible el objeto
                    TxtDatoABuscar.Visibility = Visibility.Hidden;//FJRF - Ponemos invisible el objeto
                    LblTituloInmovilizarColumnas.Visibility = Visibility.Hidden;//FJRF - Ponemos invisible el objeto
                    CboInmovilizarColumnas.Visibility = Visibility.Hidden;//FJRF - Ponemos invisible el objeto
                }
            }
            catch (Exception ex) 
            {
                StrCaptionBox = "PROCESO CANCELADO";//FJRF - Titulo del mensaje
                StrMensajeBox = ex.Message.ToString();//FJRF - Mensaje a enviar

                Msgbox(StrCaptionBox, StrMensajeBox, MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
            }
        }

        #region FJRF - CargarCombo
        private Boolean CargarCombo(ComboBox CboComboACargar, string strConsultaOracle, string strSelectedValuePath, string strDisplayMemberPath)
        {
            Boolean BooSiHayDatos = false;//FJRF - Variable para informar si hay datos o no
            CboComboACargar.ItemsSource = null;
            CboComboACargar.Items.Clear();//FJRF - Borramos los posibles datos que pueda tener el combo

            DtConsulta = new DataTable();//FJRF - Inicializamos la variable
            DsConsulta = new DataSet();//FJRF - Inicializamos la variable

            DtConsulta = MdoGeneral.consulta(strConsultaOracle);//FJRF - Realizamos la consulta y retornamos los datos

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                BooSiHayDatos = true;//FJRF - Informamos que hay datos

                DataRow drEncabezado;//FJRF - Creamos un manejador de filas
                drEncabezado = DtConsulta.NewRow();//FJRF - Decimos que ese manejador de filas tiene una nueva fila

                DtConsulta.Rows.Add(drEncabezado);//FJRF - Y que esa filas van a pertenecer al DataTable

                DsConsulta.Tables.Add(DtConsulta);//FJRF - Adicionameos el datatable al dataset
                CboComboACargar.ItemsSource = DsConsulta.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboComboACargar.SelectedValuePath = strSelectedValuePath.ToUpper();//FJRF - Cargamos la posicion
                CboComboACargar.DisplayMemberPath = strDisplayMemberPath.ToUpper();//FJRF - Decimos cual dato se mostrara

                CboComboACargar.SelectedIndex = 0;//FJRF - Ponemos el combo en la primera posicion
            }
            return BooSiHayDatos;//FJRF - Avisamos que si hay o no hay datos
        }

        #region FJRF - PonerFoto

        private void PonerImagen(string strCodigoReferencia, string strCodigoColor, string strNombreReferencia)
        {
            if (String.IsNullOrEmpty(strCodigoColor))
            {
                BitmapImage b = new BitmapImage();
                if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg"))
                {
                    b.BeginInit();
                    b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg");
                    b.EndInit();
                    imgFoto.Stretch = Stretch.Fill;
                    imgFoto.Source = b;
                    ImagenTooltip.Source = b;
                    txbNombreImagen.Text = strNombreReferencia;
                }
                else
                {
                    imgFoto.Source = null;
                }
            }
            else
            {
                BitmapImage b = new BitmapImage();
                if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg"))
                {
                    b.BeginInit();
                    b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg");
                    b.EndInit();
                    imgFoto.Stretch = Stretch.Fill;
                    imgFoto.Source = b;
                    ImagenTooltip.Source = b;
                    txbNombreImagen.Text = strNombreReferencia;
                }
                else
                {
                    if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg"))
                    {
                        b.BeginInit();
                        b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg");
                        b.EndInit();
                        imgFoto.Stretch = Stretch.Fill;
                        imgFoto.Source = b;
                        ImagenTooltip.Source = b;
                        txbNombreImagen.Text = strNombreReferencia;
                    }
                    else
                    {
                        Boolean BooExiste = false;
                        //Foto para cualquier color-Consultar colores para referencia
                        clases.CLSMAEPRO mae = new clases.CLSMAEPRO { CODREF_PRO = strCodigoReferencia };
                        DataTable val = mae.BuscarColor();

                        foreach (DataRow r in val.Rows)
                        {
                            if (!String.IsNullOrEmpty(r["Codigo"].ToString()))
                            {
                                string StrRuta = MDOgeneral.Fotos_BOSI + strCodigoReferencia + r["Codigo"].ToString() + ".jpg";
                                if (File.Exists(StrRuta))
                                {

                                    BitmapImage BitFoto = new BitmapImage();
                                    BitFoto.BeginInit();
                                    BitFoto.UriSource = new Uri(StrRuta);
                                    BitFoto.EndInit();
                                    imgFoto.Source = BitFoto;
                                    ImagenTooltip.Source = BitFoto;
                                    txbNombreImagen.Text = strNombreReferencia;

                                    BooExiste = true;

                                    break;//FJRF - Si la encontro nos salimos
                                }
                            }
                        }

                        if (BooExiste == false)
                        {
                            imgFoto.Source = null;
                        }
                    }
                }
            }
        }

        #endregion

        #region FJRF - ValidaSiEsNumerico
        public class IsNumericValidation
        {
            public static bool IsNumeric(string anyString)
            {
                bool isNumeric = false;
                Double outValue;
                isNumeric = Double.TryParse(anyString, out outValue);
                if (isNumeric)
                {
                    isNumeric = !(Double.IsNaN(outValue) ||
                                    Double.IsInfinity(outValue) ||
                                    Double.IsPositiveInfinity(outValue) ||
                                    Double.IsNegativeInfinity(outValue));
                }
                return isNumeric;
            }
        }
        #endregion

        #region FJRF - ParaAlinearALaDerecha
        public static Style newCellStyleAlinearDerecha()
        {
            System.Windows.Style style = new Style(typeof(DataGridCell));
            style.Setters.Add(new System.Windows.Setter
            {
                Property = Control.HorizontalAlignmentProperty,
                Value = HorizontalAlignment.Right
            });
            return style;
        }
        #endregion

        #region FJRF - CajaDeTextoMsgbox
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        #endregion

        #endregion
    }
}
